package com.spzx.user.service.impl;

import java.util.List;
import java.util.Arrays;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.spzx.common.core.utils.DateUtils;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.spzx.user.mapper.RegionMapper;
import com.spzx.user.domain.Region;
import com.spzx.user.service.IRegionService;
import org.springframework.util.CollectionUtils;

/**
 * 地区信息Service业务层处理
 *
 * @author atguigu
 * @date 2024-07-03
 */
@Service
public class RegionServiceImpl extends ServiceImpl<RegionMapper, Region> implements IRegionService
{
    @Resource
    private RegionMapper regionMapper;

    /**
     * 查询地区信息列表
     *
     * @param region 地区信息
     * @return 地区信息
     */
    @Override
    public List<Region> selectRegionList(Region region)
    {
        return regionMapper.selectRegionList(region);
    }
    /*
        动态规划/分治算法  优化 递归
     */
    @Override
    public List<Region> listRegionTree() {
        /*
            1、方式1：多表联查
                    通过ResultMap解析查询到的结果 组装
                    性能差
            select t1.* , t2.* ,t3.*
            from region t1
            join region t2
            on t1.code = t2.parent_code
            join region t3
            on t2.code = t3.parent_code
            2、方式2：查询region表所有数据
                    在java业务层组装数据：筛选出省集合，遍历省，为每个省筛选出市集合，遍历每个市为它筛选出区集合
                select * from region;
         */
        List<Region> regions = this.list();
        if(CollectionUtils.isEmpty(regions)){
            return null;
        }
        //1、筛选出一级地区信息：省
        List<Region> provinces = regions.stream().filter(region -> region.getParentCode().equals("0")).collect(Collectors.toList());
        if(CollectionUtils.isEmpty(provinces)){
            return null;
        }
        //排除1级地区信息
        regions = regions.stream().filter(region -> !region.getParentCode().equals("0")).collect(Collectors.toList());
        //递归筛选组装1级地区信息的 2级和3级信息，每处理完一批数据可以将该数据排除掉
        buildRegionTree(provinces,regions);
//        //2、筛选出下一级地区信息：市
//        provinces.forEach(province -> {
//            List<Region> cities = regions.stream().filter(region ->
//                    // 使用遍历的地区信息对象的 parentCode 和省code值比较，如果一致，该地区就是 省下面的市
//                    region.getParentCode().equals(province.getCode())
//            ).collect(Collectors.toList());
//            //3、筛选出市的下一级地区信息：区
//            if(!CollectionUtils.isEmpty(cities)){
//                   cities.forEach(city->{
//                       List<Region> districts = regions.stream().filter(region ->
//                               // 使用遍历的地区信息对象的 parentCode 和省code值比较，如果一致，该地区就是 省下面的市
//                               region.getParentCode().equals(city.getCode())
//                       ).collect(Collectors.toList());
//                       city.setChildren(districts);
//                   });
//            }
//            province.setChildren(cities);
//        });
        return provinces;
    }
    /*
        使用递归 组装数据的方法
                参数1：表示上一级region数据集合
                参数2：表示所有的region数据集合
                 业务： 给上一级region集合 筛选出下一级集合 组装
     */
    private void buildRegionTree(List<Region> reigions, List<Region> allRegions) {
        //上一级为空  或者  剩余的可挑选的下一级region为空  直接结束
        if(CollectionUtils.isEmpty(reigions)|| CollectionUtils.isEmpty(allRegions)){
            return;
        }
        //遍历上一级region
        reigions.forEach(parent ->{
            //筛选出下一级region集合设置给上一级
            List<Region> children = allRegions.stream().filter(region -> region.getParentCode().equals(parent.getCode())).collect(Collectors.toList());
            //将子集合设置给父地区信息
            parent.setChildren(children);
            if(!CollectionUtils.isEmpty(children)){
                //子集合不为空，他们可能还有下一级子集合
                //1、将上面使用过的子集合地区信息过滤掉  只保留还未使用的数据
               List<Region> newAllRegions  = allRegions.stream().filter(region -> !region.getParentCode().equals(parent.getCode())).collect(Collectors.toList());
                //2、给子集合继续查找下一级组装
                buildRegionTree(children ,newAllRegions);
            }
        });
    }

}
